package org.amf.channel;

import java.net.URL;

/**
 * La classe ChannelInizializator inizializza il canale
 * di comunicazione HTTP o HTTPS
 *
 * @author Federico Casani
 */
public class ChannelInizializator {

    public enum ChannelType {HTTP,HTTPS,NA}
    public static final int HTTP_SC_OK = 200;

    // url dove eseguire HTTP POST -- da valutare se recuperarli come <PARAM
    private final String PATH_POST = "/AMFtest/HTTPAuthenticator"; // localhost test
    // url dove eseguire il redirect del flusso
    // in caso di state=200 -- da valutare se recuperarli come <PARAM
    private final String PATH_FORWARD = "/AMFtest/jsp/stepOne.jsp"; // localhost test

    private String urlPOST;
    private String urlFORWARD;

    private int statusResponse = 0;
    

    public ChannelInizializator(URL codeBase, byte[] message) {

       switch(this.recognizeChannelType(codeBase)) {

            case HTTP:
                /*
                 * HTTP POST
                 */
                HTTPChannel httpChannel = new HTTPChannel(this.getUrlPOST(), message);
                this.setStatusResponse(httpChannel.getStatusResponse());
                break;

            case HTTPS:
                /*
                 * HTTPS POST
                 */
                HTTPSChannel httpsChannel = new HTTPSChannel(this.getUrlPOST(), message);
                this.setStatusResponse(httpsChannel.getStatusResponse());
                break;

            case NA:
                // lo status resta settato a zero: default
                break;

        }

    }

    
    private ChannelType recognizeChannelType(URL codeBase)  {

        ChannelType channelType = ChannelType.valueOf(codeBase.getProtocol().toUpperCase());

        this.initChannelUrls(codeBase, channelType);

        return (channelType != null) ? channelType : ChannelType.NA;
    }

    /**
     * Metodo che inizializza le url del channel
     * i.e. potrebbe esserci in fututo anche una GET
     *
     * @param codeBase
     * @param channelType
     */
    private void initChannelUrls(URL codeBase, ChannelType channelType) {

        /*
         * N.B. solo la parte hostname e port recupero
         * dal codebase: il path potrebbe non appartenere
         * al context in cui giace l'applet
         */
        String hostName = codeBase.getHost();
        // affinche' possa essere utilizzato anche con appletviwer
        if (hostName.length() < 2) {
            hostName = "localhost";
        }
        int port = codeBase.getPort();

        switch (channelType) {

            case HTTP:
                // affinche' possa essere utilizzato anche con appletviwer
                if (port == -1) {
                    port = 8080;
                }
                this.urlPOST = "http://" + hostName + ":" + port + PATH_POST;
                this.urlFORWARD = "http://" + hostName + ":" + port + PATH_FORWARD;
                break;

            case HTTPS:
                // affinche' possa essere utilizzato anche con appletviwer
                if (port == -1) {
                    port = 8443;
                }
                this.urlPOST = "https://" + hostName + ":" + port + PATH_POST;
                this.urlFORWARD = "https://" + hostName + ":" + port + PATH_FORWARD;
                break;

            case NA:
                this.urlPOST = "";
                this.urlFORWARD = "";
                break;

        }
        
    }

    
    public String getUrlFORWARD() {
        return urlFORWARD;
    }

    private String getUrlPOST() {
        return urlPOST;
    }

    public int getStatusResponse() {
        return statusResponse;
    }

    private void setStatusResponse(int statusResponse) {
        this.statusResponse = statusResponse;
    }

}
